package com.dayuanit.dy17.mix.proxy;

import com.dayuanit.dy17.mix.proxy.dynamicproxy.ServiceBeginInvocationHandler;
import com.dayuanit.dy17.mix.proxy.dynamicproxy.ServiceStartInvocationHandler;
import com.dayuanit.dy17.mix.proxy.service.IPayService;
import com.dayuanit.dy17.mix.proxy.service.IUserService;
import com.dayuanit.dy17.mix.proxy.service.impl.PayServiceImpl;
import com.dayuanit.dy17.mix.proxy.service.impl.UserServiceImpl;
import com.dayuanit.dy17.mix.proxy.staticproxy.PayServiceProxy;
import com.dayuanit.dy17.mix.proxy.staticproxy.UserServiceProxy;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        //代理模式：静态代理 和 动态代理（JDK动态代理）
//        IUserService userService = new UserServiceImpl();
//        userService.login("tom", "111");
//
//        System.out.println("---------------");
//
        IUserService userServiceProxy = new UserServiceProxy();
        userServiceProxy.login("tom", "111");
        System.out.println(userServiceProxy.getClass().getName());//com.dayuanit.dy17.mix.proxy.staticproxy.UserServiceProxy
//
//        System.out.println("---------------------");
//
//        IPayService payService = new PayServiceProxy();
//        payService.pay();

        //静态代理，静，体现在代理类是我们提前写好的，如果有新的目标类，那么我们还要为其增加
        //一个新的代理类。
        //动态代理：动，体现在代理类不需要我们写了，由工具自动生成，我们只需要写上代理的逻辑代码
        //即可。
        //所以静态和动态的区别，就在于代理类上。自动生成的代理类就是动态代理，反之就是静态代理。
        //我们实际开发中，基本上都是使用动态代理。


        //动态生成UserService的代理类
//        IUserService userServiceProxy = (IUserService)Proxy.newProxyInstance(Test.class.getClassLoader(),
//                new Class[]{IUserService.class},
//                new ServiceStartInvocationHandler(new UserServiceImpl()));
//
//        userServiceProxy.login("tom", "111");

        IPayService payServiceProxy = (IPayService)Proxy.newProxyInstance(Test.class.getClassLoader(),
                new Class[]{IPayService.class},
                new ServiceStartInvocationHandler(new PayServiceImpl()));

        payServiceProxy.pay();
        System.out.println(payServiceProxy.getClass().getName());

        //JDK动态代理
//        IUserService userServiceProxy = (IUserService)Proxy.newProxyInstance(Test.class.getClassLoader(),
//                new Class[]{IUserService.class},
//                new ServiceBeginInvocationHandler(new UserServiceImpl()));
//
//        userServiceProxy.login("tom", "111");
//        System.out.println(userServiceProxy.getClass().getName());//com.sun.proxy.$Proxy0

    }
}
